﻿using Newtonsoft.Json;
using System;

namespace XC.Keys
{
    public class KeyHelper : IKeyHelper
    {
        /// <summary>
        /// 1、软件开启自检测 2、检索密钥，判断密钥信息 3、ok：1  反之 0
        /// </summary>
        public int OnStart()
        {
            XcRegistry re = new XcRegistry();
            var aa = re.GetValue("KeyData");

            if (string.IsNullOrEmpty(aa))//密钥未加载
            {
                //未加载密钥   --禁止软件启动
                return 0;
            }
            else
            {
                DES es = new DES();
                var buffer = es.DesDecrypt(aa);
                if (string.IsNullOrEmpty(buffer))
                {
                    return 0;
                }
                var model = JsonConvert.DeserializeObject<KeyInfoBase>(buffer);
                //密钥已加载
                var lasttime = re.GetValue("LastDate");

                if (lasttime == null)
                {
                    //第一次加载，无记录
                    var curTime = DateTime.Now;
                    if (curTime >= model.StartDate && curTime <= model.EndDate)
                    {
                        //正常使用时间范围，可以运行
                        if (model.MachineCode == "AAAAAA")
                        {
                            OnClose();
                            return 1;
                        }
                        else
                        {
                            //设置了机器码，需要比对当前设备的机器码是否一致
                            var macid = es.GetCpuID();
                            if (macid == model.MachineCode)
                            {
                                OnClose();
                                //机器码一致，放行，
                                return 1;
                            }
                            else
                            {
                                //当前设备不可运行
                                return 0;
                            }
                        }
                    }
                    else
                    {
                        //系统时间晚于截止时间，禁止运行
                        return 0;
                    }
                }
                else//存在上次使用时间，判断用户是否修改了系统时间
                {
                    var curTime = DateTime.Now;
                    var last = DateTime.Parse(lasttime);
                    if (curTime >= model.StartDate && curTime <= model.EndDate && curTime > last)
                    {
                        //正常使用时间范围，可以运行
                        if (model.MachineCode == "AAAAAA")
                        {
                            OnClose();
                            //特殊机器码，不处理，只比较时间
                            return 1;
                        }
                        else
                        {
                            //设置了机器码，需要比对当前设备的机器码是否一致
                            var macid = es.GetCpuID();
                            if (macid == model.MachineCode)
                            {
                                OnClose();
                                //机器码一致，放行，
                                return 1;
                            }
                            else
                            {
                                //当前设备不可运行
                                return 0;
                            }
                        }
                    }
                    else
                    {
                        //用户修改了系统时间，禁止运行
                        return 0;
                    }
                }
            }
        }

        /// <summary>
        /// 加载密钥
        /// </summary>
        public void Loadkey(string buffer)
        {
            XcRegistry re = new XcRegistry();
            re.DeleteReg();
            re.SetValue("KeyData", buffer);
        }

        public void OnClose()
        {
            XcRegistry re = new XcRegistry();

            var buffer = DateTime.Now;
            re.SetValue("LastDate", buffer.ToString());
        }
    }
}
